package 越短越合法

func continuousSubarrays(nums []int) int64 {
	var cnt int64 = 0
	left := 0
	maxV, minV := nums[0], nums[0]
	for right, num := range nums {
		if num < minV {
			minV = num
		}
		if num > maxV {
			maxV = num
		}
		for (num-minV > 2 || maxV-num > 2) && left <= right {
			//left移动后需要计算当前窗口的最值
			left++
			if left > right {
				maxV, minV = nums[right], nums[right]
			} else {
				// 重新计算[left, right]的max和min（简化处理，也可用单调队列优化）
				maxV, minV = nums[left], nums[left]
				for i := left; i <= right; i++ {
					if nums[i] > maxV {
						maxV = nums[i]
					}
					if nums[i] < minV {
						minV = nums[i]
					}
				}
			}
		}
		cnt += int64(right - left + 1)
	}
	return cnt
}

//func continuousSubarrays(nums []int) (ans int64) {
//	cnt := map[int]int{}
//	left := 0
//	for right, x := range nums {
//		cnt[x]++
//		for {
//			mx, mn := x, x
//			for k := range cnt {
//				mx = max(mx, k)
//				mn = min(mn, k)
//			}
//			if mx-mn <= 2 {
//				break
//			}
//			out := nums[left]
//			cnt[out]--
//			if cnt[out] == 0 {
//				delete(cnt, out)
//			}
//			left++
//		}
//		ans += int64(right - left + 1)
//	}
//	return
//}
//
//作者：灵茶山艾府
//链接：https://leetcode.cn/problems/continuous-subarrays/solutions/2327219/shuang-zhi-zhen-ping-heng-shu-ha-xi-biao-4frl/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
